package A一周刷爆LeetCode.A基础班.C认识NlogN的排序;

import A一周刷爆LeetCode.A基础班.B认识复杂度和简单排序算法.Sort;

import java.util.Objects;

/**
 * @author wei.zhao
 * @description: 快排3.0版本
 * @date 2022年01月14日 10:51
 */
public class Code08_QuickSort03 extends Sort {

    @Override
    public void sort(int[] arr) {
        if (Objects.isNull(arr) || arr.length < 2) {
            return;
        }
        quickSort(arr, 0, arr.length - 1);
    }

    private void quickSort(int[] arr, int l, int r) {
        // 为什么有小于的情况，partition已经保证了最左/最右位置有序，这时候-1、+1就有小于的情况了。
        if (l <= r) {
            return;
        }
        int[] border = partition(arr, l, r);
        //左边排序
        quickSort(arr, l, border[0] - 1);
        //右边排序
        quickSort(arr, border[1] + 1, r);
    }

    private int[] partition(int[] arr, int l, int r) {
        int[] result = new int[2];
        int lp = l;
        int rp = r;
        int random = (int) Math.random() * (r - l + 1) + l;
        int num = arr[random];
        for (int i = l; i <= rp; i++) {
            if (arr[i] < num) {
                swap(arr, i, lp++);
            } else if (arr[i] > num) {
                swap(arr, i--, rp--);
            }
        }
        result[0] = lp;
        result[1] = rp;
        return result;
    }

}
